home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2001 May / SGI Freeware 2001 May - Disc 1.iso / dist / patchSG0003911.idb / usr / share / catman / p_man / cat5 / dso.z.z / dso.z / dso
Text File  |  2001-01-10  |  76KB  |  1,281 lines

  1. DSO(5)                                                Last changed: 1-29-99
  2.  
  3.  
  4. NNAAMMEE
  5.      DDSSOO - Dynamic Shared Object (DSO)
  6.  
  7. IIMMPPLLEEMMEENNTTAATTIIOONN
  8.      IRIX systems
  9.  
  10. DDEESSCCRRIIPPTTIIOONN
  11.      This man page describes Dynamic Shared Objects (DSOs).
  12.  
  13.      It is divided into the following 4 sections:
  14.  
  15.      * Overview
  16.  
  17.      * Linking and building DSOs
  18.  
  19.      * Performance considerations
  20.  
  21.      * Frequently asked questions
  22.  
  23. OOVVEERRVVIIEEWW
  24.      A DSO is an ELF format object file.  It is very similar in structure
  25.      to an executable program, but it has no main program.  It has the
  26.      following components:
  27.  
  28.      * A shared component, which consists of shared text and read-only
  29.        data.
  30.  
  31.      * A private component, which consists of data and the Global Offset
  32.        Table (GOT).
  33.  
  34.      * Several sections that hold information needed to load and link the
  35.        object.
  36.  
  37.      * A lliibblliisstt, which is the list of other DSOs referenced by this
  38.        object.  Most libraries supported on IRIX platforms are available as
  39.        DSOs.
  40.  
  41.    PPoossiittiioonn IInnddeeppeennddeenntt CCooddee ((PPIICC))
  42.      A DSO is relocatable at runtime; it can be loaded at any virtual
  43.      address.  A consequence of this is that all references to external
  44.      symbols must be resolved at runtime.
  45.  
  46.      References from a private region (that is, from private data) are
  47.      resolved at load time.  References from a shared region (that is, from
  48.      shared text) go through the indirection table, which is also called
  49.      the Global Offset Table (GOT), and incur a small performance penalty.
  50.  
  51.      The GOT helps facilitate Position Independent Code (PIC).  PIC is code
  52.      that satisfies references indirectly by using the GOT, which allows
  53.      code to be relocated simply by updating the GOT.  Each executable and
  54.      each DSO has its own GOT.  The GOT is a data table with the actual
  55.      addresses of global data with appropriate code generation and linking
  56.      support.  The linker, lldd(1), constructs the GOT.
  57.  
  58.      PIC satisfies references indirectly by using the GOT, which allows
  59.      code to be relocated simply by updating the GOT.  PIC can be shared by
  60.      multiple users.  Each program must have its own data space.  Code
  61.      sharing and independent data is arranged automatically by the
  62.      compilation and run-time systems.
  63.  
  64.      Code compiled for use in a DSO is PIC.  Non-PIC code is usually
  65.      referred to as non-shared.  Non-shared code and PIC cannot be mixed in
  66.      the same object.
  67.  
  68.    WWhhaatt HHaappppeennss aatt RRuunnttiimmee??
  69.      The runtime events are as follows:
  70.  
  71.      1. eexxeecc(2) loads the main program and then loads one of the following
  72.         interpreters as specified in the main program:
  73.  
  74.         * //uussrr//lliibb//lliibbcc..ssoo..11 is loaded for programs compiled with the --3322
  75.           compiler option.
  76.  
  77.         * //uussrr//lliibb3322//lliibbcc..ssoo..11 is loaded for programs compiled with the
  78.           --nn3322 compiler option.
  79.  
  80.         * //uussrr//lliibb6644//lliibbcc..ssoo..11 is loaded for programs compiled with the --6644
  81.           compiler option.
  82.  
  83.      2. The interpreter loads rrlldd(5), the runtime linking loader, which
  84.         finishes the eexxeecc(2) operation.  Starting with the main program's
  85.         lliibblliisstt, rrlldd(5) loads each DSO on the list that is not marked to be
  86.         delay-loaded.  rrlldd(5) reads that object's lliibblliisstt and repeats the
  87.         operation until all DSOs have been loaded, in a breadth-first
  88.         manner.  The breadth first loading process, which ignores objects
  89.         marked to be delay-loaded, results in defining a sequence of
  90.         objects.
  91.  
  92.      3. rrlldd(5) allocates storage for COMMON block symbols and fixes up
  93.         symbolic references in each loaded object.  This is necessary
  94.         because the location at which the object will be loaded is not
  95.         known until runtime.  To look up a given symbol in the process of
  96.         fixing up symbolic references, rrlldd(5) examines each object's
  97.         dynamic symbol table.  If rrlldd(5) finds a strong symbol that
  98.         satisfies the reference (that is, it has the name of the given
  99.         symbol and is an external definition) it stops with that symbol.
  100.         If it does not find a strong definition with that name, then the
  101.         first weak symbol found is accepted as the definition.
  102.  
  103.      4. Each object's --iinniitt code is executed.  This is code specified as an
  104.         argument to the --iinniitt option on the lldd(1) command.  For information
  105.         on --iinniitt code, see lldd(1).
  106.  
  107.      5. Control transfers to ____ssttaarrtt in the main program.
  108.  
  109.      The sequence at which the --iinniitt code is run is important to
  110.      applications and DSOs that have --iinniitt code.  By default, objects are
  111.      taken in reverse order of the sequence defined in loading.  If --iinniitt
  112.      code in one DSO calls a DSO with --iinniitt code that has not yet run, then
  113.      the --iinniitt code in the called DSO is run before the called DSO routine
  114.      is actually called.  Thus, the default order is not followed.
  115.  
  116.      It is not an error for DSOs to mutually call one another, even
  117.      indirectly, from within --iinniitt sections, but the resulting DSO ordering
  118.      can be confusing and can vary depending on actions in the application
  119.      --iinniitt code.  The --iinniitt code in delay-loaded DSOs is not run until the
  120.      DSO is actually loaded, and the delay-loaded DSO is loaded when some
  121.      routine in the delay-loaded DSO is called.
  122.  
  123.      Do not include calls to sspprroocc(2), nnsspprroocc(2), sspprrooccsspp(2), or any POSIX
  124.      threads (pthreads) routines from within --iinniitt or --ffiinnii code.  The
  125.      following table describes the problem with --iinniitt and --ffiinnii code in
  126.      pthreads and sspprroocc(2) applications:
  127.  
  128.      --------------------------------------------------------------------
  129.                          ssiiggpprrooccmmaasskk((22)) GGeettttiinngg   ssiiggpprrooccmmaasskk((22)) SSeettttiinngg
  130.      TThhrreeaaddss??            MMaasskk BBiittss                MMaasskk BBiittss
  131.      --------------------------------------------------------------------
  132.      sspprroocc(2) threads    Sees more masked than    Settings lost on exit
  133.                          non-init.                of --iinniitt and --ffiinnii.
  134.      pthreads            Sees more masked than    Application settings
  135.                          non-init.                preserved.
  136.      No threads          Sees true setting.       Application settings
  137.                                                   preserved.
  138.      --------------------------------------------------------------------
  139.  
  140.      The preceding table entries can be explained as follows:
  141.  
  142.      * In the TThhrreeaaddss?? column, An sspprroocc(_2) _t_h_r_e_a_d_s application is one that
  143.        is using sspprroocc(2), nnsspprroocc(2), or sspprrooccsspp(2).  A _p_t_h_r_e_a_d_s application
  144.        is one that has lliibbpptthhrreeaadd..ssoo linked in.  A _N_o _t_h_r_e_a_d_s application
  145.        is any other application.
  146.  
  147.      * _S_e_e_s _m_o_r_e _m_a_s_k_e_d _t_h_a_n _n_o_n-_i_n_i_t means that --iinniitt and --ffiinnii code do
  148.        not get the true mask bits.  Instead, nearly all signals are marked
  149.        as masked.
  150.  
  151.      * _S_e_t_t_i_n_g_s _l_o_s_t _o_n _e_x_i_t _o_f --iinniitt _a_n_d --ffiinnii means that on exit of the
  152.        nested set of --iinniitt or --ffiinnii functions, the set of mask bits set on
  153.        entry to the functions is restored.  Any setting done by the --iinniitt
  154.        or --ffiinnii code is lost.
  155.  
  156.      * _A_p_p_l_i_c_a_t_i_o_n _s_e_t_t_i_n_g_s _p_r_e_s_e_r_v_e_d means that the ssiiggpprrooccmmaasskk(2) bit
  157.        settings that are made by the --iinniitt or --ffiinnii code are preserved on
  158.        exit of the --iinniitt or --ffiinnii function set.
  159.  
  160.      * _S_e_e_s _t_r_u_e _s_e_t_t_i_n_g means that the mask bits that ssiiggpprrooccmmaasskk(2)
  161.        returns to --iinniitt and --ffiinnii code are the true application mask bits.
  162.  
  163.      As the preceding table shows, the complexities with signal masks
  164.      inhibit successful ssiiggpprrooccmmaasskk(2) operation in --iinniitt or --ffiinnii code.
  165.      Generally, the results are not going to be what is desired.
  166.  
  167.      Also ignored, in theory, are symbols in any DSO that is loaded at
  168.      runtime because it is on the lliibblliisstt of a DSO opened by ddllooppeenn(3C) or
  169.      ssggiiddllooppeenn__vveerrssiioonn(3C).  rrlldd(5) makes the lliibblliisstt DSO symbols visible,
  170.      but no application should count on this visibility.  However, if a
  171.      DSO's symbols are visible for any reason (for example, because it was
  172.      in the main program's lliibblliisstt), that DSO is not hidden just because it
  173.      is also on the library list of a DSO opened with ddllooppeenn(3C) or
  174.      ssggiiddllooppeenn__vveerrssiioonn(3C).
  175.  
  176.      When execution terminates, the --ffiinnii code of each DSO and the base
  177.      aa..oouutt file is run in the opposite order the actual --iinniitt code was run
  178.      (or would have been run, in the case of DSOs with --ffiinnii code but no
  179.      --iinniitt code).  --ffiinnii code and --iinniitt code consist of code specified as
  180.      an argument to the lldd(1) For more information on --ffiinnii code and --iinniitt
  181.      code, see the rest of this man page and see lldd(1).
  182.  
  183.      Other factors can affect the general load process, too.  For more
  184.      information, see the information on Quickstart and delayed loads on
  185.      this man page and see the ssggiiddllaadddd(3C), ssggiiddllooppeenn__vveerrssiioonn(3C), and
  186.      ddllooppeenn(3C) man pages.
  187.  
  188.    --iinniitt CCooddee RRuunnttiimmee OOrrddeerriinngg
  189.      The general order in which the base executable DSO's --iinniitt code is run
  190.      is specified by the MIPS Application Binary Interface (API).  For more
  191.      information on this ABI, see the URLs mentioned in the SEE ALSO
  192.      section.
  193.  
  194.      Before an --iinniitt in object AA is run, you can assume that all --iinniitt
  195.      sections in DSOs that AA depends on have been run.  However, if --iinniitt
  196.      code calls a DSO with --iinniitt code that has not yet run, the --iinniitt code
  197.      of the called DSO is run first.
  198.  
  199.      The physical ordering starts with the last DSO in rrlldd(5)'s list and
  200.      works toward the executable file.  This is a depth-first postorder
  201.      call of --iinniitt code.  This is a particular choice of ordering within
  202.      the conceptual framework.  The physical ordering is not specified by
  203.      the MIPS ABI.
  204.  
  205.      The run order of delay-loaded DSOs and DSOs that have been opened by
  206.      ddllooppeenn(3C) is recorded so that --ffiinnii operations occur in reverse
  207.      order.
  208.  
  209.      Any DSO that is delay-loaded during the execution of --iinniitt code
  210.      changes the order in which --iinniitt sections are run.  The actual manner
  211.      of the changes is difficult to predict.  At the time of the
  212.      delay-load, the --iinniitt code scan is restarted anew (new due to the new
  213.      DSO) at the end of rrlldd(5)'s list.
  214.  
  215.    --ffiinnii CCooddee RRuunnttiimmee OOrrddeerriinngg
  216.      The --ffiinnii code of the DSOs in the base executable is run choosing DSOs
  217.      in the opposite order the actual --iinniitt code was run (or would have
  218.      been run, in the case of DSOs with --ffiinnii code but no --iinniitt code).
  219.  
  220.    LLiimmiittaattiioonnss oonn --iinniitt aanndd --ffiinnii CCooddee
  221.      In most versions of rrlldd(5), --iinniitt and --ffiinnii code could not
  222.      successfully perform delay-load operations, such as ddllooppeenn(3C),
  223.      ssggiiddllaadddd(3C), ddllssyymm(3C), ddllcclloossee(3C), or implicit delay-load
  224.      operations, if the application used sspprroocc(2), sspprrooccsspp(2), nnsspprroocc(2),
  225.      or pthreads.  Threaded applications hung if such operations were
  226.      included in --iinniitt or --ffiinnii code or were nested codes outside of --iinniitt
  227.      or --ffiinnii code.
  228.  
  229.      The current release of rrlldd(5), however, supports nested delay-load
  230.      operations, but it is unwise to depend too much on this support.  For
  231.      example, it is unwise to use delay-loading with C++ global
  232.      initialization code because much about the interaction of name
  233.      resolution (name binding and symbol binding) with nested delay-load
  234.      operations is unspecified.
  235.  
  236.      For example, calling a delay-load routine or calling delay-loaded
  237.      functions in different orders depending on startup conditions means
  238.      that the ordering of DSOs on rrlldd(5)'s list of DSOs may vary.  If the
  239.      order varies and there are multiple definitions of an external
  240.      (different functions with the same name), exactly what is executed
  241.      from run to run may differ.  Considering that is it difficult, in C++,
  242.      to control the sequence in which different compilation units --iinniitt
  243.      code is executed, and potentially, you have serious application
  244.      problems.
  245.  
  246.      It is also difficult to debug such code as debuggers often have
  247.      difficulting intercepting calls in --iinniitt sections.
  248.  
  249.      In multithreaded programs, --iinniitt and --ffiinnii code should avoid attempts
  250.      to acquire (by using pptthhrreeaadd__mmuutteexx__lloocckk(3P), for example) resources
  251.      owned by other threads, unless it can be guaranteed that the other
  252.      thread can release the resource without performing a delay-load
  253.      operation or lazy text resolution.  Should the thread owning the
  254.      resource make a call into rrlldd(5), the threads deadlock.
  255.  
  256.      It is difficult to predict whether execution of a given section of
  257.      code requires lazy text resolution.  A DSO's GOT can be reset to point
  258.      at function stubs when it fails to Quickstart or after delay-load
  259.      operations that might affect resolution of its symbols.  See the
  260.      section on Quickstart in the PERFORMANCE CONSIDERATIONS section of
  261.      this man page for more information on function resolution.
  262.  
  263.      The C++ runtime system uses the --iinniitt and --ffiinnii mechanism to construct
  264.      and destroy static objects.  Therefore, constructors and destructors
  265.      for such objects should avoid blocking calls if DSOs using them are to
  266.      be manipulated by ddllooppeenn(3C) or ddllcclloossee(3C) or are to be delay-loaded
  267.      within a multithreaded program.
  268.  
  269. LLIINNKKIINNGG AANNDD BBUUIILLDDIINNGG DDSSOOss
  270.      Assume that your library is in an archive lliibbffoooo..aa of object files,
  271.      all of which have been compiled with the lldd(1) command's --sshhaarreedd
  272.      option.  The library references symbols found in lliibbcc..ssoo..11, lliibbggll..ssoo,
  273.      lliibbXX1111..ssoo, and lliibbnneettllss..ssoo, but most programs never use the path that
  274.      requires lliibbnneettllss..ssoo.  It is recommended that you build your DSO,
  275.      lliibbffoooo..ssoo, in the following way:
  276.  
  277.           ld
  278.           -elf
  279.           -shared
  280.           -no_unresolved
  281.           -rdata_shared
  282.           -soname libfoo.so
  283.           -o libfoo.so
  284.           -all libfoo.a
  285.           -lX11
  286.           -delay_load -lnetls
  287.           -lc
  288.           -lgl
  289.  
  290.      This builds a DSO called lliibbffoooo..ssoo that directs rrlldd(5) to load
  291.      lliibbcc..ssoo..11, lliibbXX1111..ssoo, and lliibbggll..ssoo whenever lliibbffoooo..ssoo is loaded.  This
  292.      command line also loads lliibbnneettllss..ssoo if it is ever referenced.
  293.  
  294.      NNOOTTEE::     If you have any C++ object files among the objects making up
  295.                your DSO, you must replace lldd in the previous example
  296.                command with CCCC.  That is, your command line should be as
  297.                follows:
  298.  
  299.                     CC -elf -shared ... -o libfoo.so -all libfoo.a ...
  300.  
  301.                However, you do not have to do anything special at all to
  302.                use such C++ DSOs when linking other programs against these
  303.                DSOs.  You can link C++ DSOs into C, C++, or Fortran
  304.                programs using your usual link commands or link other DSOs
  305.                against these C++ DSOs without taking any special action.
  306.                For example, the following command line links the preceding
  307.                C++ DSO lliibbffoooo..ssoo properly:
  308.  
  309.                     f77 fortran_prog.o -lfoo
  310.  
  311.    CCoonnttrroolllliinngg SSyymmbboollss EExxppoorrtteedd bbyy aa DDSSOO
  312.      One benefit from using DSOs is the ability to release new versions of
  313.      an object and be assured that objects linked against the old version
  314.      will work with the new version.  This is impossible to guarantee,
  315.      however, if the set of symbols exported by an object cannot easily be
  316.      understood by the object's creator.  lldd(1) provides several options to
  317.      help you control the symbols that are exported by a DSO.
  318.  
  319.      By default, lldd(1) does not export symbols that are supplied by a
  320.      linked-in archive or DSO.  The developer is probably only a consumer
  321.      of the linked-in object, not  an exporter.  In a subsequent release,
  322.      the developer may not require the linked-in object, and if the symbols
  323.      provided by the linked-in object had been exported by the developer's
  324.      object, the new object would no longer be upwardly compatible with the
  325.      original version.  This behavior can be overridden by using the
  326.      --eexxppoorrttss option on the lldd(1) command.  This default symbol hiding
  327.      behavior, with respect to archives, is also overridden when building a
  328.      DSO from an archive using the --aallll option.
  329.  
  330.      You can control the list of symbols that are exported by using the
  331.      following lldd(1) options:  --eexxppoorrtteedd__ssyymmbbooll, --eexxppoorrttss__ffiillee, --eexxppoorrttss,
  332.      --hhiiddeess, --hhiiddddeenn__ssyymmbbooll, and --hhiiddeess__ffiillee.  The first two options let
  333.      you specifically list the symbols to be exported by the DSO.  The
  334.      eexxppoorrtteedd__ssyymmbbooll option is followed by a comma-sepatated list of names.
  335.      The eexxppoorrttss__ffiillee option accepts a file name that contains a
  336.      space-separated (including newlines) list of names.  If any symbols
  337.      are specifically exported, only those symbols are exported.  All other
  338.      symbols are automatically hidden.  The last two options specify a list
  339.      of symbols that are not to be exported by the DSO.  For more
  340.      information on the lldd(1) options, see the lldd(1) man page.
  341.  
  342.      There are two consequences of hiding symbols.  First, those symbols do
  343.      not provide resolution to any undefined symbols in an object that
  344.      links in the DSO.  Second, any references to those symbols within the
  345.      DSO are resolved internally to the hidden symbol.
  346.  
  347.    RRuulleess ooff TThhuummbb
  348.      The following list contains things to remember when using the lldd(1)
  349.      command:
  350.  
  351.      * Use the --nnoo__uunnrreessoollvveedd option to find unresolved symbols.  It is not
  352.        always possible to supply all the DSOs that will be referenced by
  353.        lliibbffoooo..ssoo on the link line, but in general, libraries should be
  354.        self-contained.  This is especially true for subsequent releases of
  355.        a DSO.  If a DSO has any unresolved references, they must be
  356.        resolved by some other loaded object.  Having unresolved symbols
  357.        invites disaster because there is no guarantee that the symbols will
  358.        be resolved.  Thus, the application may not run.
  359.  
  360.      * Link against the minimum set of ..ssoo files needed.  Loading a DSO
  361.        carries a cost.  Linking against unneeded DSOs causes them to be
  362.        loaded even if they are never referenced.  lldd(1) issues a message
  363.        when you have linked against a DSO that resolves no symbols.
  364.  
  365.      * When building a C++ DSO, specify the --eexxppoorrttss option for any DSO
  366.        that provides the definitions of classes from which classes in the
  367.        object being created are derived.  Specifying --eexxppoorrttss in this case
  368.        ensures that consumers of the object being created can create
  369.        subclasses of classes provided by that object without having to know
  370.        the complete set of DSOs that need to be loaded.  Using the --eexxppoorrttss
  371.        option in this case may bring in unwanted symbols.  Use the
  372.        --eexxppoorrtteedd__ssyymmbbooll, --eexxppoorrttss__ffiillee, --hhiiddddeenn__ssyymmbbooll, or --hhiiddeess__ffiillee
  373.        options where appropriate.
  374.  
  375.      * Use the --rrddaattaa__sshhaarreedd option to move all read-only data into the
  376.        shared segment.  Unfortunately, many programs write to supposedly
  377.        read-only data.  The --rrddaattaa__sshhaarreedd option is disabled by default for
  378.        this reason.  The --uussee__rreeaaddoonnllyy__ccoonnsstt compiler option is enabled by
  379.        default.
  380.  
  381.      * If you reference one of the graphics libraries, either lliibbggll..ssoo or
  382.        lliibbGGLL..ssoo, put the library last in the link line.  Often lliibbggll..ssoo
  383.        cannot be Quickstarted.  Putting it last allows all prior objects to
  384.        be Quickstarted.  You can also choose to delay-load the graphics
  385.        libraries.  This allows your application to Quickstart.  For
  386.        information on Quickstart, see the PERFORMANCE CONSIDERATIONS
  387.        section of this man page.
  388.  
  389.      * Anytime a referenced object changes, you should either relink, in
  390.        order to Quickstart, or you should run the reQuickstart tool rrqqss(1)
  391.        on the object.
  392.  
  393.      * Try to minimize inter-DSO data references.
  394.  
  395.      * Try to minimize the use of global data.  In DSOs, it is generally
  396.        more efficient to allocate space when needed, using mmaalllloocc(3C) or
  397.        mmaalllloocc(3F), rather than to use a large static data structure.
  398.  
  399.      * Try to pack data together that is likely to be unmodified.  This
  400.        allows the kernel to make more of the data pages shared,
  401.        copy-on-write.
  402.  
  403.      * Use the --ddeellaayy__llooaadd option on any DSO on the link line that is not
  404.        often used.  This incurs a small performance penalty for the
  405.        references to it, but this can save time and memory for those
  406.        programs that don't use it.  In addition, using this option on
  407.        programs that have --iinniitt or --ffiinnii code also incurs a performance
  408.        penalty.
  409.  
  410.      * Do not call any of the following from code that may be executed
  411.        during processing by the --iinniitt or --ffiinnii options:  ddllcclloossee(3C),
  412.        ddlleerrrroorr(3C), ddllooppeenn(3C), ddllssyymm(3C), nnsspprroocc(2), sspprroocc(2), sspprrooccsspp(2),
  413.        ssggiiddllaadddd(3C), and ssggiiddllooppeenn__vveerrssiioonn(3C).
  414.  
  415.      * Avoid having weak and strong versions of a symbol that are loaded
  416.        into memory at different times (by a --ddeellaayy--llooaadd option or by
  417.        ssggiiddllaadddd(3C) or ddllooppeenn(3C) calls).
  418.  
  419.      * Avoid performing a ddllcclloossee(3C) on an object that has been opened by
  420.        ssggiiddllaadddd(3C).
  421.  
  422.      * Try to avoid using --iinniitt code by not using the option and by
  423.        avoiding definition of C++ global objects that require --iinniitt code
  424.        for construction.
  425.  
  426. PPEERRFFOORRMMAANNCCEE CCOONNSSIIDDEERRAATTIIOONNSS
  427.      The following subsections describe verious performance considerations.
  428.  
  429.    QQuuiicckkssttaarrtt
  430.      When building a DSO or an executable, lldd(1) assigns addresses to the
  431.      object and attempts to resolve all references.  At runtime, if rrlldd(5)
  432.      verifies that the same set of objects are loaded at the original
  433.      addresses, then rrlldd(5) can skip all the runtime relocation work and
  434.      let the program run.  This saves time because the relocations are not
  435.      performed, and it saves memory because rrlldd(5) does not have to read in
  436.      the sections that hold the relocation information.
  437.  
  438.      At static link time, lldd(1) resolves each unresolved function call.
  439.      When an unresolved function is called at runtime, rrlldd(5) performs the
  440.      relocation needed for all future calls to the original function.  In
  441.      this way, more programs can Quickstart even if some of the function
  442.      references are not resolved at static link time.
  443.  
  444.      Quickstart fails if the DSOs on a system do not match the objects used
  445.      when linking either the application or the DSOs upon which the
  446.      application depends.  This can occur if a new version of a DSO is
  447.      released.
  448.  
  449.      You can use the rrqqss(1) command to recalculate the Quickstart
  450.      information associated with an application or a DSO.  rrqqss(1) must be
  451.      called in proper order so that DSOs on an object's lliibblliisstt are
  452.      reQuickstarted before the object is reQuickstarted.  rrqqss(1) rewrites
  453.      the object it is reQuickstarting back in place.  You can use the lldd(1)
  454.      command's --nnoo__rrqqss option to mark an object as non-reQuickstartable.
  455.  
  456.    AAvvooiiddiinngg GGrraattuuiittoouuss SShhaarreedd OObbjjeecctt LLooaaddss
  457.      rrlldd(5) does a considerable amount of work and can use up large amounts
  458.      of real memory, so it is better not to link against DSOs that are not
  459.      needed.
  460.  
  461.    RReedduucciinngg tthhee NNuummbbeerr ooff CCoonnfflliiccttss
  462.      A _c_o_n_f_l_i_c_t arises whenever more than one DSO (including the main
  463.      program) needed by an executable defines and uses the same name for a
  464.      symbol.  The name for which multiple definitions exist is recorded in
  465.      your program in the section named ..ccoonnfflliicctt.  The names of all
  466.      conflicting symbols pertaining to a program can be obtained by using
  467.      --DDcc flag to eellffdduummpp(1).  One example of a conflict is the mmaalllloocc
  468.      routine, which is defined both in lliibbcc..ssoo..11 and in lliibbmmaalllloocc..ssoo.
  469.  
  470.      Conflicts represent extra work to be done at startup because the
  471.      presence of a conflict means that the objects in the link may not have
  472.      chosen a consistent instance of the symbol in question.  This extra
  473.      work is memory-intensive because even one conflict can mean that many
  474.      pages of memory must be examined by rrlldd(5).  This intensive
  475.      examination would otherwise not be needed for a Quickstarting program.
  476.      The lldd(1) command's --qquuiicckkssttaarrtt__iinnffoo option causes lldd(1) to issue a
  477.      warning about every conflict it finds and to write the names of two of
  478.      the objects in which it is defined.  Of course, sometimes conflicts
  479.      are a necessary design component of certain applications.
  480.  
  481.    DDeellaayyeedd LLooaaddss
  482.      The overhead associated with objects that are referenced but seldom
  483.      used can be mitigated by using ddllooppeenn(3C), ssggiiddllooppeenn__vveerrssiioonn(3C),
  484.      ssggiiddllaadddd(3C), or delayed loads.  Using any of these delays the loading
  485.      of a DSO (and the objects on its lliibblliisstt) until it is actually
  486.      referenced.  The --ddeellaayy__llooaadd option on the lldd(1) command is the
  487.      easiest and most convenient to use.  All three require that there be
  488.      no references from any other object's data section to the delay-loaded
  489.      DSO.
  490.  
  491. FFRREEQQUUEENNTTLLYY AASSKKEEDD QQUUEESSTTIIOONNSS
  492.      This section contains answers to frequently asked questions.  The
  493.      questions and their answers are as follows:
  494.  
  495.      11.. WWhhaatt iiss aa DDSSOO??
  496.  
  497.      DSO stands for _D_y_n_a_m_i_c _S_h_a_r_e_d _O_b_j_e_c_t.  DSOs give applications the
  498.      ability to share the text of heavily used libraries, which need not be
  499.      included in the executable file.
  500.  
  501.      22.. HHooww ddoo II mmaaiinnttaaiinn bbiinnaarryy ccoommppaattiibbiilliittyy bbeettwweeeenn vveerrssiioonnss ooff DDSSOOss??
  502.  
  503.      Binary compatibility is maintained as long as the DSOs maintain the
  504.      same exported symbols, add new symbols without removing any or
  505.      changing semantics, and don't change exported structures.  The
  506.      ordering of symbols, routines, and global data is irrelevant.
  507.  
  508.      33.. WWhhaatt oobbjjeecctt ffiillee ffoorrmmaatt ddoo DDSSOOss uussee??
  509.  
  510.      DSOs use the ELF object file format as defined in the SVR4 ABI.
  511.  
  512.      44.. HHooww ddoo II iinnssttaallll tthhee ttoooollss ssoo II ccaann uussee DDSSOOss oonn mmyy ssyysstteemm??
  513.  
  514.      To compile and build DSOs, you need to nstall the IRIX Development
  515.      Foundation (IDF) and the IRIX Development Libraries (IDL); these were
  516.      formerly known as the Developer's Option.  In addition, you must have
  517.      a compiler.
  518.  
  519.      55.. HHooww ddoo II bbuuiilldd aann eexxeeccuuttaabbllee ffiillee tthhaatt uusseess aa DDSSOO??
  520.  
  521.      A command line like the following links mmyyffiillee..cc with lliibbmmiinnee..ssoo and
  522.      with lliibbcc..ssoo..11:
  523.  
  524.           cc myfile.c -lmine
  525.  
  526.      If lliibbmmiinnee..ssoo is not available, but lliibbmmiinnee..aa is available, lliibbmmiinnee..aa
  527.      is used along with lliibbcc..ssoo..11, and you get dynamic linking.  To
  528.      explicitly state that you want the DSO to be used, add the
  529.      --ccaallll__sshhaarreedd option to the cccc(1) line, as follows:
  530.  
  531.           cc -call_shared myfile.c -lmine
  532.  
  533.      66.. HHooww ddoo II bbuuiilldd aann eexxeeccuuttaabbllee ffiillee tthhaatt ddooeess nnoott uussee sshhaarreedd lliinnkkiinngg??
  534.  
  535.      Use the --nnoonn__sshhaarreedd option, as follows:
  536.  
  537.           cc -non_shared myfile.c -lmine
  538.  
  539.      Some libraries are not available as nonshared.  The ones that are
  540.      available are not installed by default, so you must request their
  541.      installation.  In general, the --nnoonn__sshhaarreedd option is outmoded.
  542.  
  543.      77.. HHooww ddoo II tteellll iiff aann eexxeeccuuttaabbllee ffiillee wwiillll uussee ddyynnaammiicc lliinnkkiinngg??
  544.  
  545.      Entering the following command generates the ELF program header:
  546.  
  547.           elfdump -o
  548.  
  549.      This header contains all the information necessary for eexxeecc(2) and
  550.      rrlldd(5) to run the program or DSO.  Only aa..oouutt files that use dynamic
  551.      linking have a PPHHDDRR, IINNTTEERRPP, or DDYYNNAAMMIICC entry.  An example and a more
  552.      detailed description is as follows:
  553.  
  554. % elfdump -o /bin/cat
  555.  
  556.                   ***PROGRAM HEADER***
  557. Type     Offset      Vaddr      Paddr     Filesz      Memsz      Align RWX
  558.    PHDR 0x00000034 0x00400034 0x00400034 0x000000c0 0x00000000 0x00000004 r--
  559.  INTERP 0x00000100 0x00400100 0x00400100 0x00000009 0x00000009 0x00000004 r--
  560. REGINFO 0x00000110 0x00400110 0x00400110 0x00000018 0x00000018 0x00000004 r--
  561. DYNAMIC 0x00000150 0x00400150 0x00400150 0x00000a70 0x00000a70 0x00000010 r--
  562.    LOAD 0x00000000 0x00400000 0x00400000 0x00003000 0x00003000 0x00001000 r-x
  563.    LOAD 0x00003000 0x10000000 0x10000000 0x00001000 0x00001290 0x00010000 rwx
  564.  
  565.      Each line is an entry in the program header and refers to a _s_e_g_m_e_n_t of
  566.      the file, as follows:
  567.  
  568.      LLiinnee      SSeeggmmeenntt
  569.  
  570.      PPHHDDRR      Points to the program header itself within the file.  Only
  571.                executable files that use dynamic linking have this field.
  572.  
  573.      IINNTTEERRPP    Points to the location of the name of the interpreter
  574.                required for this program.  For any old 32-bit ABI object,
  575.                compiled with --3322, this is //uussrr//lliibb//lliibbcc..ssoo..11.  For any new
  576.                32-bit ABI object, compiled with --nn3322, this is
  577.                //uussrr//lliibb3322//lliibbcc..ssoo..11.  For any 64-bit ABI object, compiled
  578.                with --6644, this is //uussrr//lliibb6644//lliibbcc..ssoo..11.
  579.  
  580.      RREEGGIINNFFOO   Points to the location of the register setup information.
  581.                This information can be seen by entering the eellffdduummpp --rreegg
  582.                command.  For the old 32-bit ABI, obtained when compiling
  583.                with --3322, this consists of the correct global pointer (gp)
  584.                value for this object.  For the new 32-bit or 64-bit ABIs,
  585.                obtained when compiling with --nn3322 or --6644, this entry does
  586.                not appear in this table; for these ABIs, the information is
  587.                in ..MMIIPPSS..ooppttiioonnss, which can be seen by entering the
  588.                eellffdduummpp --rreegg or eellffdduummpp --oopp commands.
  589.  
  590.      DDYYNNAAMMIICC   Points to information in the file needed by rrlldd(5).
  591.                Includes the lliibblliisstt (which can be seen by entering the
  592.                eellffdduummpp --DDll command), a symbol table (which can be seen by
  593.                entering the eellffdduummpp --DDtt command), and other information.
  594.  
  595.      LLOOAADD      Points to segments that are to be mapped into the memory
  596.                image.
  597.  
  598.      The columns give various information about each segment, as follows:
  599.  
  600.      CCoolluummnn    CCoonntteenntt
  601.  
  602.      OOffffsseett    The offset in the file to the beginning of the segment.
  603.  
  604.      VVaaddddrr     The virtual address of the beginning of the segment in the
  605.                memory image of the file, assuming that it was mapped as
  606.                described in the LLOOAADD entries.
  607.  
  608.      PPaaddddrr     The same as VVaaddddrr.
  609.  
  610.      FFiilleesszz    The size of the segment in the file.
  611.  
  612.      MMeemmsszz     The size of the segment in the memory image.  When MMeemmsszz is
  613.                greater than FFiilleesszz, the bytes after FFiilleesszz are zero-filled.
  614.  
  615.      AAlliiggnn     The alignment required by this section.  If a segment is to
  616.                be mapped somewhere into memory other than at VVaaddddrr, the new
  617.                address must be congruent to VVaaddddrr modulo the alignment.  In
  618.                the preceding example, the first segment must always be
  619.                loaded at a page boundary, and the second must always be
  620.                loaded at a 64K boundary.
  621.  
  622.      RRWWXX       Specifies the protections, read, write, or execute, for the
  623.                segment.
  624.  
  625.      Programs that are linked with the --nnoonn__sshhaarreedd option on the compiler
  626.      command line do not have a PPHHDDRR, IINNTTEERRPP, or DDYYNNAAMMIICC section.  Thus,
  627.      the eellffdduummpp --oo command is a convenient way to determine whether a
  628.      program is linked as nonshared.  For more information on this command,
  629.      see the eellffdduummpp(1) man page.
  630.  
  631.      88.. HHooww ddoo II bbuuiilldd aa DDSSOO??
  632.  
  633.      Perform the following steps:
  634.  
  635.      1. Build a _f_i_l_e..oo or _f_i_l_e..aa that contains all the routines you want to
  636.         have in your _f_i_l_e..ssoo (your DSO).  This can be done with a compiler
  637.         and aarr(1).
  638.  
  639.      2. Invoke lldd(1) with the --sshhaarreedd option.  Normally, the extension ..ssoo
  640.         is used to designate DSOs.
  641.  
  642.      Example 1:
  643.  
  644.           cc -c myobj.c
  645.           ld -shared myobj.o -o myobj.so
  646.  
  647.      Example 2:
  648.  
  649.           cc -c myobj.c
  650.           cc -shared myobj.o -o myobj.so
  651.  
  652.      Example 3:
  653.  
  654.           <build libmine.a the usual way>
  655.           ld -shared -all libmine.a -o libmine.so
  656.  
  657.      The --aallll option in the third example directs lldd(1) to include all the
  658.      routines in the library.  This option is needed because there are not
  659.      undefined references in the program, which is the usual way for lldd(1)
  660.      to determine whether to load files from an archive.
  661.  
  662.      99.. WWhheerree ddooeess tthhee ssyysstteemm llooookk ffoorr DDSSOOss aatt rruunnttiimmee??
  663.  
  664.      The search path for DSOs is acquired in the following order for
  665.      programs compiled with the --3322 compiler option:
  666.  
  667.      1. The path of the DSO if given in the lliibblliisstt
  668.  
  669.      2. In any directories specified with the --rrppaatthh option when the
  670.         executable file was built
  671.  
  672.      3. In any directory specified by the LLDD__LLIIBBRRAARRYY__PPAATTHH environment
  673.         variable, if it is defined
  674.  
  675.      4. In the directories in the default path, which is //uussrr//lliibb,
  676.         //uussrr//lliibb//iinntteerrnnaall, //lliibb, //lliibb//ccmmppllrrss//cccc, //uussrr//lliibb//ccmmppllrrss//cccc,
  677.         //oopptt//lliibb.
  678.  
  679.      If the __RRLLDD__RROOOOTT environment variable is defined, then its value is
  680.      appended to the front of any path specified by the --rrppaatthh option and
  681.      the default path.  __RRLLDD__RROOOOTT itself is a colon (::) separated list.
  682.  
  683.      For programs compiled with the --nn3322 compiler option, the rules are
  684.      similar, but the following differences exist:
  685.  
  686.      * The LLDD__LLIIBBRRAARRYYNN3322__PPAATTHH is used if LLDD__LLIIBBRRAARRYY__PPAATTHH is defined.
  687.  
  688.      * __RRLLDDNN3322__RROOOOTT is used for the list of paths
  689.  
  690.      * The default path directory list is //uussrr//lliibb3322, //uussrr//lliibb3322//iinntteerrnnaall,
  691.        //lliibb3322, //oopptt//lliibb3322.
  692.  
  693.      For programs compiled with the --6644 compiler option, the rules are
  694.      similar, but the following differences exist:
  695.  
  696.      * The LLDD__LLIIBBRRAARRYY6644__PPAATTHH is used if LLDD__LLIIBBRRAARRYY__PPAATTHH is defined.
  697.  
  698.      * __RRLLDD6644__RROOOOTT is used for the list of paths.
  699.  
  700.      * The default path directory list is //uussrr//lliibb6644, //uussrr//lliibb6644//iinntteerrnnaall,
  701.        //lliibb6644, //oopptt//lliibb6644.
  702.  
  703.      See the rrlldd(5) man page for more details.
  704.  
  705.      1100.. WWhhaatt iiss QQuuiicckkssttaarrtt??
  706.  
  707.      Quickstart is an optimization.  Using an ssoo__llooccaattiioonnss file, lldd(1)
  708.      prerelocates each DSO as if it had been loaded (or _l_i_n_k_e_d, which is
  709.      the term often used) by lldd(1)) at the address in the ssoo__llooccaattiioonnss
  710.      file.  If no errors occur at startup, all DSOs map to their Quickstart
  711.      addresses, and rrlldd(5) does not need to perform a relocation pass.
  712.      When new software is installed with iinnsstt(1M) or sswwmmggrr(1M), rrqqssaallll(1)
  713.      changes many DSO virtual addresses, attempting to ensure that all
  714.      registered applications (written to //vvaarr//iinnsstt//..rrqqssffiilleess) can be
  715.      Quickstarted.  At the same time, rrqqssaallll(1) updates ssoo__llooccaattiioonnss.
  716.  
  717.      If more than one DSO attempts to map to the same address, the IRIX
  718.      kernel moves one of them to an unused address range, and rrlldd(5)
  719.      performs a relocation pass to fix the address references.
  720.  
  721.      If one or more of the DSOs linked against at static link time has
  722.      changed by the time the program executes, rrlldd(5) performs extra work
  723.      to ensure that symbols have been resolved to their proper value.
  724.  
  725.      1111.. WWhhaatt iiss tthhee tthhee //uussrr//lliibb//ssoo__llooccaattiioonnss ffiillee??
  726.  
  727.      After you build a DSO, a file called ssoo__llooccaattiioonnss is placed in the
  728.      directory with the DSO.  This file is a registry of DSOs.  It
  729.      maintains the default, or Quickstart, addresses of a group of DSOs
  730.      that are guaranteed to never have their default locations overlap with
  731.      one another.  It is generated and updated by lldd(1) each time it builds
  732.      a DSO.
  733.  
  734.      If you make substantial library changes between one build of the
  735.      library and another, you should remove the ssoo__llooccaattiioonnss file before
  736.      rebuilding the library.  You do this because the information derived
  737.      from the older build and put in the ssoo__llooccaattiioonnss files can make the
  738.      new library build unsuccessful.
  739.  
  740.      rrqqssaallll(1) and rrqqss(1) can rearrange aa..oouutt files and DSOs to restore
  741.      Quickstartability, so the ssoo__llooccaattiioonnss file is less important than it
  742.      was before rrqqss(1) existed.  For information on address ranges, see the
  743.      following files:  //uussrr//lliibb//ssoo__llooccaattiioonnss, //uussrr//lliibb3322//ssoo__llooccaattiioonnss, and
  744.      //uussrr//lliibb6644//ssoo__llooccaattiioonnss.
  745.  
  746.      //uussrr//lliibb//ssoo__llooccaattiioonnss applies to programs compiled with the --3322
  747.      compiler option.  //uussrr//lliibb3322//ssoo__llooccaattiioonnss applies to programs compiled
  748.      with the --nn3322 compiler option.  //uussrr//lliibb6644//ssoo__llooccaattiioonnss applies to
  749.      programs compiled with the --6644 compiler option.  These files represent
  750.      the default layout for the system DSOs in the respective ABIs.  Those
  751.      who build DSOs may find it interesting to consult these files in order
  752.      to avoid collisions between their DSOs and system DSOs.  You do not
  753.      need to consult this file if you merely run programs that use DSOs.
  754.  
  755.      If you build DSOs, two lldd(1) command options may be useful to you:
  756.      --cchheecckk__rreeggiissttrryy and --uuppddaattee__rreeggiissttrryy.  The
  757.      --uuppddaattee__rreeggiissttrryy _l_o_c_a_t_i_o_n__f_i_l_e option examines _l_o_c_a_t_i_o_n__f_i_l_e and
  758.      builds the current ..ssoo at a location that does not conflict with
  759.      anything in the file (unless the current one is listed). The
  760.      --uuppddaattee__rreeggiissttrryy option examines _l_o_c_a_t_i_o_n_s__f_i_l_e, as does
  761.      --cchheecckk__rreeggiissttrryy, and attempts to write an entry for the ..ssoo file being
  762.      built into _l_o_c_a_t_i_o_n_s__f_i_l_e.  The --cchheecckk__rreeggiissttrryy _l_o_c_a_t_i_o_n__f_i_l_e option
  763.      does not write to _l_o_c_a_t_i_o_n_s__f_i_l_e.  If _l_o_c_a_t_i_o_n_s__f_i_l_e is not writable,
  764.      the --uuppddaattee__rreeggiissttrryy option performs like the --cchheecckk__rreeggiissttrryy option.
  765.      If _l_o_c_a_t_i_o_n_s__f_i_l_e is not readable or writable, the --cchheecckk__rreeggiissttrryy and
  766.      --uuppddaattee__rreeggiissttrryy options may cause lldd(1) to generate one or more error
  767.      messages.
  768.  
  769.      1122.. WWhhaatt ddiirreeccttiivveess ccaann bbee ppuutt iinnttoo aa ssoo__llooccaattiioonnss ffiillee??
  770.  
  771.      The following directives control the placement of new DSOs:
  772.  
  773.      * $$tteexxtt__aalliiggnn__ssiizzee==_a_l_i_g_n ppaaddddiinngg==_p_a_d__s_i_z_e
  774.        and
  775.        $$ddaattaa__aalliiggnn__ssiizzee==_a_l_i_g_n ppaaddddiinngg==_p_a_d__s_i_z_e
  776.           These two directives specify the alignment and padding
  777.           requirements for text and data segments, respectively.  The size
  778.           value in ssoo__llooccaattiioonn is calculated based on:  section size +
  779.           padding, aligned to the section align size.  The align values for
  780.           text and data, as well as the padding values, must be aligned to
  781.           a bucket size.  If not, lldd(1) generates a warning message and
  782.           aligns these values to the bucket size.
  783.  
  784.      * $$ssttaarrtt__aaddddrreessss==_a_d_d_r
  785.           Specifies the beginning address for DSOs.
  786.  
  787.      * $$ddaattaa__aafftteerr__tteexxtt==[ 11 | 00 ]
  788.           Instructs the linker to place data immediately after the text at
  789.           specified text and data alignment requirements.  The default is
  790.           0.
  791.  
  792.      * _s_o__n_a_m_e [ ::_s_t == {{ ..tteexxtt || ..ddaattaa || $$_r_a_n_g_e] }} _b_a_s_e__a_d_d_r,,_p_a_d__s_i_z_e :: ]] **
  793.           This directive consists of the following elements:
  794.  
  795.           EElleemmeenntt        CCoommppoossiittiioonn
  796.  
  797.           _s_o__n_a_m_e        Full path name (or trailing component) of a DSO.
  798.  
  799.           _s_t             String that identifies the start of the segment
  800.                          description.
  801.  
  802.           ..tteexxtt or ..ddaattaa or $$_r_a_n_g_e
  803.                          Specify either a segment type, text or data, or a
  804.                          _r_a_n_g_e.  Specifying a _r_a_n_g_e limits the range of
  805.                          addresses that can be used.  Specifications of
  806.                          ..tteexxtt or ..ddaattaa are for internal use only.
  807.  
  808.           _b_a_s_e__a_d_d_r      Address at which the segment starts.
  809.  
  810.           _p_a_d__s_i_z_e       Padded size of the segment
  811.  
  812.      WWAARRNNIINNGG::  The format and use of the ssoo__llooccaattiioonnss file is under review
  813.                and may in the future move to a simpler format.  Currently,
  814.                only $$rraannggee should be specified, not ..tteexxtt or ..ddaattaa, in the
  815.                specification.
  816.  
  817.                When building a DSO with the --cchheecckk__rreeggiissttrryy or
  818.                --uuppddaattee__rreeggiissttrryy option of the lldd(1) command when there is
  819.                already an entry that corresponds to this DSO in the
  820.                ssoo__llooccaattiioonn file, the linker attempts to assign the same
  821.                addresses for text and data.  However, if the size of the
  822.                DSO changes and does not fit in the specified location, the
  823.                linker searches for another location.  If the optional
  824.                $$rraannggee comment is specified, the linker places the DSO in
  825.                the specified range of addresses.  If there is not enough
  826.                room, a message is generated.
  827.  
  828.      A comment line can be inserted at any point a directive can be
  829.      inserted.  A comment is a line beginning with the number sign (##)
  830.      character.
  831.  
  832.      1133.. IIff II ddoonn''tt hhaavvee aa vvaalliidd ssoo__llooccaattiioonnss ffiillee,, ccaann II ggeenneerraattee oonnee ffrroomm
  833.      aallll tthhee ..ssoo ffiilleess iinn //uussrr//lliibb??
  834.  
  835.      Not easily.  It is an error if the ssoo__llooccaattiioonnss is missing.  Every
  836.      ssoo__llooccaattiioonnss file is different because rrqqssaallll(1) reQuickstarts
  837.      everything.
  838.  
  839.      If //vvaarr//iinnsstt//..rrqqssffiilleess is present, you could get a set of ssoo__llooccaattiioonnss
  840.      files from a similar system and rerun rrqqssaallll(1) as iinnsstt(1M) and
  841.      sswwmmggrr(1M) do.  If you do this, make a back-up copy of ..rrqqssffiilleess before
  842.      starting rrqqssaallll(1).
  843.  
  844.      NNOOTTEE::     If anything destroys or results in the loss of ..rrqqssffiilleess,
  845.                the only way to recreate ..rrqqssffiilleess is to reinstall
  846.                everything on the system.  Make a back-up copy of ..rrqqssffiilleess.
  847.  
  848.      1144.. HHooww eexxppeennssiivvee iiss iitt,, aatt rruunnttiimmee,, NNOOTT ttoo uussee tthhee --uuppddaattee__rreeggiissttrryy
  849.      ooppttiioonn??
  850.  
  851.      If you use rrqqssaallll(1) or rrqqss(1) to reQuickstart an application and its
  852.      DSOs, then there need not be any cost.  rrqqss(1) can make the DSOs
  853.      Quickstartable regardless how the DSO addresses were determined.
  854.  
  855.      If you do not use rrqqss(1), then the lack of an updated registry can
  856.      impose startup costs.  It is very difficult to say how much a
  857.      particular executable will suffer because it depends on which DSOs the
  858.      program uses and whether they have been Quickstarted for the same
  859.      address.  When there is a conflict between two objects, one will be
  860.      moved, which means that all addresses referring to names in that
  861.      object need to be relocated.
  862.  
  863.      1155.. HHooww aanndd wwhheenn wwiillll QQuuiicckkssttaarrtt bbee uusseedd??
  864.  
  865.      The linker uses Quickstart unless there are unresolved symbols at
  866.      static link time.
  867.  
  868.      Every executable and every DSO contains a list of objects that were
  869.      examined at static link time when the object was made.  This list also
  870.      contains timestamps and checksums for each of the objects.  Various
  871.      levels of extra work are required if the timestamp or checksum changed
  872.      in the library at runtime.
  873.  
  874.      1166.. WWhhaatt aabboouutt rruunnttiimmee llooaaddiinngg uunnddeerr uusseerr ccoonnttrrooll??
  875.  
  876.      The library allows you to dynamically load your own DSOs as needed.
  877.      The individual library calls are as follows:
  878.  
  879.      * ddllooppeenn(3C), which opens a DSO.
  880.  
  881.      * ddllssyymm(3C), which finds the value of a name defined in an object.
  882.  
  883.      * ddllcclloossee(3C), which closes a DSO.
  884.  
  885.      * ddlleerrrroorr(3C), which reports errors.
  886.  
  887.      * ssggiiddllaadddd(3C), which functions much like ddllooppeenn(3C), but it exposes
  888.        all symbols to the rest of the program.
  889.  
  890.      * ssggiiddllooppeenn__vveerrssiioonn(3C), which functions much like ddllooppeenn(3C), but it
  891.        allows specifying a specific required version of the DSO.
  892.  
  893.      Consult the individual man pages for details.
  894.  
  895.      1177.. WWhhaatt bbeenneeffiittss wwiillll II ggeett ffrroomm DDSSOOss??
  896.  
  897.      Executables linked with DSOs are smaller because the DSOs are not part
  898.      of the executable file image.
  899.  
  900.      Executables that use a DSO need not be relinked if a DSO is changed.
  901.      After the updated DSO is installed, the executable picks it up
  902.      automatically.
  903.  
  904.      DSOs allow application designers to make more machine-independent
  905.      software.  System-dependent routines can be given a uniform interface,
  906.      and a DSO that implements that interface can be built for each
  907.      different platform.  Actual applications can be shipped to various
  908.      platforms and run on them all.
  909.  
  910.      DSOs give applications the ability to change the binding of symbols at
  911.      runtime and under user control.
  912.  
  913.      1188.. WWhhaatt ccoossttss aarree aassssoocciiaatteedd wwiitthh DDSSOOss??
  914.  
  915.      A DSO incurs two costs, both against performance.
  916.  
  917.      The first is a start-up cost incurred while rrlldd(5) maps in the various
  918.      objects, performs symbol resolution, etc.  This cost is usually small
  919.      compared to the time it takes to contact the X server, for example.
  920.  
  921.      The second is the cost incurred when using position-independent code.
  922.      A DSO's text must be compiled with the --KKPPIICC option in effect in order
  923.      for the object file to be put into a DSO without further modification.
  924.      Because this option is in effect by default, it is not necessary to
  925.      specifiy it.  By default, PIC is slower by 5% to 15%.  With full
  926.      optimization, however, the speed reduction can be near zero.  PIC code
  927.      seems to be worst on very small-leaf routines that access global data.
  928.  
  929.      Routines written in assembly language for non-PIC use (for example,
  930.      routines written before PIC was available for IRIX) need to be
  931.      modified before the --KKPPIICC option can be used.  For more information on
  932.      modifying your code, see the _M_I_P_S_p_r_o _A_s_s_e_m_b_l_y _L_a_n_g_u_a_g_e _P_r_o_g_r_a_m_m_e_r'_s
  933.      _G_u_i_d_e.
  934.  
  935.      1199.. MMuusstt mmaaiinn pprrooggrraammss tthhaatt wwaanntt ttoo uussee DDSSOOss uussee --KKPPIICC ffoorr
  936.      ccoommppiillaattiioonn??
  937.  
  938.      Yes.  DSOs use --KKPPIICC so that PIC code is generated.  Main programs are
  939.      not generally position-independent, but they must still use the DSO
  940.      calling convention when calling a routine that is defined in a DSO.
  941.      In particular, this means that a main program must have a Global
  942.      Offset Table (GOT) and the code that is generated must use it.
  943.  
  944.      Modules that will become part of main programs and modules that become
  945.      part of DSOs must be compiled with the --KKPPIICC option in effect, which
  946.      is enabled by default.
  947.  
  948.      2200.. WWhhaatt ooppttiioonnss ddoo II hhaavvee wwhheenn bbuuiillddiinngg aa DDSSOO??
  949.  
  950.      If you specify the --BB ddyynnaammiicc option while linking a DSO, symbols in
  951.      the DSO are resolved in a nondefault manner.  In particular, the
  952.      runtime linker first tries to resolve symbols referenced in the object
  953.      to symbols defined in the object instead of looking for definitions in
  954.      objects in the order specified on the link line.
  955.  
  956.      The effect is that all symbols defined and used in such objects are
  957.      non-preemptable.  Ordinarily, symbol definitions could be preempted by
  958.      a definition in an earlier DSO.  When --BB ssyymmbboolliicc is specified,
  959.      however, this is not the case.
  960.  
  961.      For more information on the --BB ddyynnaammiicc and --BB ssyymmbboolliicc options, see
  962.      the lldd(1) man page.
  963.  
  964.      2211.. WWhhaatt ddiiffffiiccuullttiieess mmaayy bbee aassssoocciiaatteedd wwiitthh DDSSOOss??
  965.  
  966.      Behind most unexpected behavior is the fact that linking semantics are
  967.      fundamentally different, but only in a subtle way.  Assume that a
  968.      program links with three libraries, lliibbAA, lliibbBB, and lliibbCC, in that
  969.      order.  Further assume that both lliibbAA and lliibbCC define symbol xx but
  970.      don't use it.  Further, assume that lliibbBB contains a reference to xx.
  971.      Archive linking (the old way) would resolve lliibbBB's reference to xx to
  972.      the definition in lliibbCC, whereas DSO linking resolves lliibbBB's reference
  973.      to xx to the definition in lliibbAA.  This is true because with archive
  974.      linking, when lliibbAA is examined, there is no outstanding reference to
  975.      xx.  The definition of xx is not extracted from the archive.  Later,
  976.      when lliibbCC is examined, there is a reference to xx, so it is loaded.
  977.  
  978.      With DSOs, all the constituent object files have been joined into one
  979.      object, so all symbol definitions are always present.  The resolution
  980.      rule is simple: take the definition in the object listed first.  Thus,
  981.      the definition in lliibbAA is used.
  982.  
  983.      Another unexpected occurrence is a _r_u_n_t_i_m_e _d_a_n_g_l_i_n_g _r_e_f_e_r_e_n_c_e.  These
  984.      occur when you build and link an application with no errors or
  985.      warnings but later receive a message from rrlldd(5) stating that your
  986.      program has unresolvable symbols.
  987.  
  988.      The problem here is that if you build a DSO as part of your program,
  989.      the linker typically does not generate messages about undefined
  990.      symbols during a link of a DSO.  This is because undefined symbols are
  991.      expected during such a build and are perfectly acceptable.  If the
  992.      main program does not use a symbol, however, it is not flagged as
  993.      undefined during static linking.  You can use the --nnoo__uunnrreessoollvveedd
  994.      option to the lldd(1) command to avoid such unexpected behavior.
  995.  
  996.      If a particular object in an archive file (lliibbll..aa, for example) has an
  997.      external reference to a data symbol, and the data symbol is expected
  998.      to be defined in the main program, the linker does not try to resolve
  999.      that external reference unless the object file in question was
  1000.      actually referenced by the main program.  If that archive is turned
  1001.      into a DSO, the external data reference must be resolved whenever ANY
  1002.      function in the DSO is used, even if no function in the object file in
  1003.      question is ever called and no use is made of the external data symbol
  1004.      in question.
  1005.  
  1006.      This can lead to a scenario in which a link that worked with the
  1007.      archives builds a program that is terminated by the runtime linker
  1008.      (rrlldd(5)).  Do not assume that you can convert libraries that contain
  1009.      external data symbols into DSOs.
  1010.  
  1011.      One remedy is to split the archive into several DSOs and place them on
  1012.      the lliibblliisstt of a master DSO.  By default, rrlldd(5) does not try to
  1013.      resolve data symbols until the first call is made to a particular
  1014.      object.  You can, however, inhibit the linker's attempt to resolve an
  1015.      offending external data symbol until a call is made to the object in
  1016.      which it is referenced.  For example, suppose that eexxtt__ddaattaa..oo is an
  1017.      object that contains an undefined external reference.  It resides in
  1018.      archive lliibbxxyyzz..aa.  Here is how to isolate that external data
  1019.      reference:
  1020.  
  1021.      1. Make eexxtt__ddaattaa..oo into a DSO all its own:
  1022.  
  1023.           % ar x libxyz.a has_ext_data.o
  1024.           % ld -shared ext_data.o -o ext_data.so
  1025.  
  1026.      2. Make lliibbxxyyzz..ssoo, excluding eexxtt__ddaattaa..oo from being included directly.
  1027.         Instead, put it in the lliibblliisstt of lliibbxxyyzz..ssoo:
  1028.  
  1029.     % ld -shared -all -exclude ext_data.o libxyz.a ext_data.so -o libxyz.so
  1030.  
  1031.      In addition to the previously mentioned caveats, applications should
  1032.      not call ddllooppeenn(3C), ssggiiddllaadddd(3C), ddllcclloossee(3C), ssggiiddllooppeenn__vveerrssiioonn(3C),
  1033.      or ddlleerrrroorr(3C) from within a signal handler.  This means that calling
  1034.      from within a signal handler calling a function that results in a DSO
  1035.      being delay-loaded is also wrong.  Ensure that functions called
  1036.      (directly or indirectly) from signal handlers are already loaded
  1037.      before a signal handler is set up.  Very few functions are safe to
  1038.      call from within a signal handler (POSIX specifies a few), and the
  1039.      delay-load functions (ddllooppeenn(3C), and so on) are not among them.
  1040.  
  1041.      2222.. WWhhaatt sshhoouulldd II ddoo aabboouutt GGlloobbaall OOffffsseett TTaabbllee ((GGOOTT)) oovveerrffllooww??  GOT
  1042.      overflow has occured if you receive messages from the linker saying
  1043.      GGPP--rreellaattiivvee sseeccttiioonnss oovveerrffllooww bbyy 00xx?????? bbyytteess, GGOOTT oovveerrffllooww, or GGOOTT
  1044.      uunnrreeaacchhaabbllee.
  1045.  
  1046.      To fix this situation, perform one of more of the following steps:
  1047.  
  1048.      * Recompile with the --TTEENNVV::llaarrggee__ggoott==OONN option on your compiler
  1049.        command line.  Only the large input file that is causing overflow
  1050.        needs to be recompiled with this option.
  1051.  
  1052.      * Break the large input _f_i_l_e..oo into two or more smaller files.
  1053.  
  1054.      * Use the --mm option on the lldd(1) command to obtian a link map.  This
  1055.        map indicates large objects that you can recompile with --GG00 or some
  1056.        other small --GG value.
  1057.  
  1058.        Data objects affected by the --GG_n_u_m option are numeric literals,
  1059.        addreses (including those generated by the compiler), all C/C++
  1060.        static veriables, and, if the --ssttaattiicc option is in effect, all
  1061.        Fortran local variables.  For more information on the --GG_n_u_m option,
  1062.        see your compiler command line.
  1063.  
  1064.      2233.. HHooww aarree mmuullttiippllee vveerrssiioonnss ooff DDSSOOss ssuuppppoorrtteedd??
  1065.  
  1066.      You can associate DSOs and executables with a version number.  This is
  1067.      intended to support interface changes.
  1068.  
  1069.      A _v_e_r_s_i_o_n _s_t_r_i_n_g consists of 3 parts and a period (..), as follows.
  1070.      The first part is the string ssggii.  The second part is a decimal
  1071.      number, which is the major number.  The third part is the period (..).
  1072.      The fourth part is a decimal number, which is the minor number.  Hence
  1073.      the format:  ssggii_m_a_j_o_r.._m_i_n_o_r.
  1074.  
  1075.      For a DSO to be versioned as ssggii11..00, add the --sseett__vveerrssiioonn ssggii11..00
  1076.      option to the compiler or loader command line to build the DSO (cccc --
  1077.      sshhaarreedd, lldd --sshhaarreedd, and so on).
  1078.  
  1079.      Whenever you make a compatible change, update the minor version number
  1080.      (the one after the period) and add the latest version string to
  1081.      colon-separated list of version strings.  For example:
  1082.      --sseett__vveerrssiioonn ssggii11..00::ssggii11..11::ssggii11..33.
  1083.  
  1084.      Whenever you make an incompatible change, update the major version
  1085.      number.  For example, use --sseett__vveerrssiioonn ssggii22..00.  Change the file name
  1086.      of the old DSO by adding a period followed by the previous major
  1087.      number to the file name of the DSO.  Do not change the soname of the
  1088.      object.  No change to the file contents are necessary or desirable.
  1089.      Simply rename the file.
  1090.  
  1091.      2244.. HHooww ddooeess vveerrssiioonniinngg wwoorrkk??
  1092.  
  1093.      Note that in this answer, items marked SGI ONLY do not apply to MSIG
  1094.      ABI binaries; they apply only to binaries generated on IRIX systems
  1095.      using a means other than the aabbiicccc(1) or aabbiilldd(1) commands.
  1096.  
  1097.      Versioning is available for NON-ABI executables only.  The ABI does
  1098.      not require objects to have versioning, nor does it require systems to
  1099.      recognize versioning.  It allows objects to contain version strings,
  1100.      but it does not require systems to do anything with this information.
  1101.  
  1102.      NON-ABI compliant executables have the RRHHFF__SSGGII__OONNLLYY bit turned on in
  1103.      the ..ddyynnaammiicc section.  This flag is reported by the eellffdduummpp(1) command
  1104.      when eellffdduummpp --LL --lloonngg is entered.  Only executables with this flag
  1105.      turned on receive the versioning treatment described in this answer.
  1106.      RRHHFF__SSGGII__OONNLLYY is turned on by default.
  1107.  
  1108.      When an executable is linked against a DSO, the last entry of the
  1109.      DSO's version string is recorded in the executable as part of the
  1110.      lliibblliisstt.  This can be examined by using the --DDll option to the
  1111.      eellffdduummpp(1) command.
  1112.  
  1113.      When an executable is linked, you may specify the --rreeqquuiirree__mmiinnoorr or
  1114.      --iiggnnoorree__mmiinnoorr options for each DSO linked against.  If --rreeqquuiirree__mmiinnoorr
  1115.      is specified, a bit will be set in the flags field of the lliibblliisstt
  1116.      entry for the DSO in question.  The default is --iiggnnoorree__mmiinnoorr.
  1117.  
  1118.      When an executable (ABI or RRHHFF__SSGGII__OONNLLYY) is run, rrlldd(5) searches for
  1119.      the proper file name in its usual search routine.
  1120.  
  1121.      (SGI_ONLY) If a file with the correct name is found, the version
  1122.      string in the lliibblliisstt is compared to the list of version strings in
  1123.      the DSO.  If the LLLL__RREEQQUUIIRREE__MMIINNOORR bit is set in the lliibblliisstt entry and
  1124.      there is an exact match between the version string in the depender and
  1125.      one of the strings in the version list of the dependee, then that
  1126.      library is used.  If the LLLL__RREEQQUUIIRREE__MMIINNOORR bit is clear and if there is
  1127.      a match of major versions, then that library is used.
  1128.  
  1129.      (SGI_ONLY) If no proper match is found, a new soname is built by
  1130.      taking the soname found in the executable's lliibblliisstt and the major
  1131.      number found in the version string that corresponds to that lliibblliisstt
  1132.      entry.  They are put together as _s_o_n_a_m_e.._m_a_j_o_r.  This is searched for
  1133.      as described previously.  Version strings are matched as described
  1134.      previously.
  1135.  
  1136.      (SGI ONLY) If, for example, BB..ssoo has a lliibblliisstt entry with a version
  1137.      list for AA..ssoo and an AA..ssoo is loaded that has no version, the DSO is
  1138.      considered a match.  If BB..ssoo has a lliibblliisstt entry with no version list
  1139.      for AA..ssoo, then the first AA..ssoo found is considered a match, no matter
  1140.      what version AA..ssoo is.  File AA..ssoo with no version can be created, for
  1141.      example, if lldd(1)'s --sseett__vveerrssiioonn option was not used or if an empty
  1142.      string was provided as an argument to the --sseett__vveerrssiioonn option.
  1143.  
  1144.      (SGI ONLY) A version string with a missing major number is an error.
  1145.      rrlldd(5) behavior is not defined for such cases.
  1146.  
  1147.      2255.. WWhhyy aarree tthhee gglloobbaall oobbjjeeccttss iinn mmyy CC++++ DDSSOO nnoott bbeeiinngg iinniittiiaalliizzeedd??
  1148.  
  1149.      Did you link your DSO using the CCCC(1) command instead of using lldd(1)
  1150.      directly?  See the C++ information in the LINKING AND BUILDING SHARED
  1151.      OBJECTS section of this man page.
  1152.  
  1153.      2266.. WWhhyy aarree ssoommee lliibbrraarriieess oonnllyy aavvaaiillaabbllee aass aa DDSSOO wwhheerreeaass ootthheerr
  1154.      lliibbrraarriieess aarree aavvaaiillaabbllee aass bbootthh aa DDSSOO aanndd aann aarrcchhiivvee??
  1155.  
  1156.      The ABI specifies the DSOs that must be on every system.  The converse
  1157.      of that is that no one can assume that any other ..ssoo is on an ABI-
  1158.      conforming system.  Libraries explicitly called out in the MIPS ABI
  1159.      are considered part of the system interface.  Such libraries are
  1160.      shipped only in DSO form.  Libraries that are not specified in the
  1161.      MIPS ABI must also be supplied in archive form to generate MIPS ABI
  1162.      compliant binaries using these libraries.
  1163.  
  1164.      For example, the libraries lliibbXX1111..ssoo and lliibbcc..ssoo..11 are explicitly
  1165.      called out in the MIPS ABI.  This makes the DSO version of XXlliibb and
  1166.      lliibbcc a system interface.  Other examples are lliibbssoocckkeett..ssoo and
  1167.      lliibbddll..ssoo, which are also only supplied as DSOs.
  1168.  
  1169.      Archive versions of lliibbXXtt..aa, lliibbXXmm..aa, lliibbmm..aa, lliibbmmaalllloocc..aa, and others
  1170.      are supplied because shared library versions of these libraries are
  1171.      not specified in the MIPS ABI.  Therefore, they are not guaranteed to
  1172.      exist on all ABI conforming systems.
  1173.  
  1174.      2277.. WWhheerree ccaann II ffiinndd mmoorree ddooccuummeennttaattiioonn oonn DDSSOOss??
  1175.  
  1176.      Besides the IRIX documentation mentioned in the SEE ALSO section of
  1177.      this man page, you may also want to consult the System V Application
  1178.      Binary Interface and the _S_y_s_t_e_m _V _A_p_p_l_i_c_a_t_i_o_n _B_i_n_a_r_y _I_n_t_e_r_f_a_c_e -- _M_I_P_S
  1179.      _P_r_o_c_e_s_s_o_r _S_u_p_p_l_e_m_e_n_t, both of which can be accessed at
  1180.      hhttttpp::////wwwwww..mmiippssaabbii..oorrgg.
  1181.  
  1182.      2288.. WWhhaatt aarree ssyymmbbooll bbiinnddiinngg pprroobblleemmss??
  1183.  
  1184.      _S_y_m_b_o_l _b_i_n_d_i_n_g, also known as _n_a_m_e _r_e_s_o_l_u_t_i_o_n, is the process of
  1185.      determining the data or function to use for an external name
  1186.      reference.  If you are developing executable files or DSOs, you need
  1187.      to address this topic, but if you are simply running predeveloped
  1188.      applications, you can assume that symbol binding has been resolved for
  1189.      you.
  1190.  
  1191.      All symbols for which there is only one definition are simple.  The
  1192.      one and only definition is used.
  1193.  
  1194.      For global references, the general approach is to examine the set of
  1195.      DSOs on the list that rrlldd(5) builds at run time and to use the first
  1196.      definition found.  If there is a weak definition, then the first of
  1197.      those is taken if and only if there is no strong definition.  If there
  1198.      is a strong definition, which might better be called a typical
  1199.      definition, the strong definition is used.  In C and C++, ##pprraaggmmaa wweeaakk
  1200.      is used to create a weak reference or definition.
  1201.  
  1202.      Typically, DSOs are added to rrlldd(5)'s list in breadth-first order,
  1203.      generating the transitive closure of all DSOs on the executable
  1204.      lliibblliisstt (as shown by the eellffdduummpp --DDll command).
  1205.  
  1206.      If the application calls ssggiiddllaadddd(3C) or has any delay-loaded DSOs,
  1207.      those DSOs are added to the end of rrlldd(5)'s DSO list when they are
  1208.      actually loaded.  If the loading is different with different data
  1209.      (that is, if the application calls functions that cause ssggiiddllaadddd(3C)
  1210.      or -delay-load operations in a different order at different times),
  1211.      the list of DSOs may be not have the same ordering.  If there are
  1212.      multiple definitions, the first definition on rrlldd(5)'s list of DSOs
  1213.      for the executable is be used.
  1214.  
  1215.      If all definitions are weak definitions, the resolution proceeds
  1216.      conceptually identically to the strong case.  If there is at least one
  1217.      strong and one weak definition of a symbol things, resolution proceeds
  1218.      as follows:
  1219.  
  1220.      1. If a strong definition is in a DSO loaded into memory, it
  1221.         supersedes any weak definitions loaded.
  1222.  
  1223.      2. If a weak definition is loaded and no strong definition is loaded,
  1224.         the weak definition is used.  If an ssggiiddllaadddd(3C) or -delay-load
  1225.         operation causes a strong definition to be loaded, the symbol may
  1226.         or may not be rebound to the new strong definition.  To avoid this
  1227.         unpredictable behavior, you may need to relink or rewrite your
  1228.         program with the following aspects of symbol resolution in mind:
  1229.  
  1230.         * You may obtain unexpected results if a strong symbol definition
  1231.           is loaded after a weak definition.  In these cases, some calls
  1232.           may refer to one version and some to another, possibly within the
  1233.           same execution.
  1234.  
  1235.         * The order in which your executable calls functions or performs
  1236.           ssggiiddllaadddd(3C) or delay-load operations can affect symbol
  1237.           resolution.
  1238.  
  1239.         * Symbols that remain undefined after linking can affect symbol
  1240.           resolution.
  1241.  
  1242.      3. Weak symbols were defined to allow ISO/ANSI C program to, for
  1243.         example, implement their own wwrriittee(()) operation while not affecting
  1244.         the operation of ffwwrriittee(()) and other ISO C calls and while still
  1245.         allowing another application to choose to call the lliibbcc wwrriittee(())
  1246.         routine.  It was expected that the strong symbol would be visible
  1247.         at the same time as the weak symbol.  If both are visible at the
  1248.         same time they work predictably.  But, as explained previously, if
  1249.         the weak symbol is visible when the strong symbol is not, the
  1250.         program can exhibit unexpected and unpredictable behavior.
  1251.  
  1252.      2299.. AArree tthheerree nneeggaattiivvee aassppeeccttss ttoo uussiinngg ddllcclloossee(3C)?
  1253.  
  1254.      Because of symbol definition order rules, do not perform a ddllcclloossee(3C)
  1255.      on a DSO that was initially opened by a call to ssggiiddllaadddd(3C).  For
  1256.      more information on this, see NAMESPACE ISSUES on the ddllooppeenn(3C) man
  1257.      page.
  1258.  
  1259. SSEEEE AALLSSOO
  1260.      cccc(1), CCCC(1), eellffdduummpp(1), ff9900(1), ff7777(1), lldd(1).
  1261.  
  1262.      eexxeecc(2), nnsspprroocc(2), ssiiggpprrooccmmaasskk(2), sspprroocc(2), sspprrooccsspp(2).
  1263.  
  1264.      ddllcclloossee(3C), ddlleerrrroorr(3C), ddllooppeenn(3C), ddllssyymm(3C), mmaalllloocc(3C),
  1265.      mmaalllloocc(3F), pptthhrreeaadd__mmuutteexx__lloocckk(3P), sseettllooccaallee(3C), ssggiiddllaadddd(3C),
  1266.      ssggiiddllooppeenn__vveerrssiioonn(3C), ssggiiggeettddssoovveerrssiioonn(3C).
  1267.  
  1268.      ccaappaabbiilliittiieess(4), ccaappaabbiilliittyy(4).
  1269.  
  1270.      aabbii(5), ggpp__oovveerrffllooww(5), rrlldd(5).
  1271.  
  1272.      _M_I_P_S_p_r_o _C_o_m_p_i_l_i_n_g _a_n_d _P_e_r_f_o_r_m_a_n_c_e _T_u_n_i_n_g _G_u_i_d_e
  1273.  
  1274.      _M_I_P_S_p_r_o _6_4-_B_i_t _P_o_r_t_i_n_g _a_n_d _T_r_a_n_s_i_t_i_o_n _G_u_i_d_e
  1275.  
  1276.      _M_I_P_S_p_r_o _A_s_s_e_m_b_l_y _L_a_n_g_u_a_g_e _P_r_o_g_r_a_m_m_e_r'_s _G_u_i_d_e
  1277.  
  1278.      hhttttpp::////wwwwww..mmiippssaabbii..oorrgg
  1279.  
  1280.      This man page is available only online.
  1281.